#include <vector>
#include <map>
#include <algorithm>
using namespace std;

class Solution {
public:
    vector<vector<int>> threeSumTarget(vector<int>& num, int target) {
        vector<vector<int>> res;
        sort(num.begin(), num.end());
        int n = num.size();

        for (int i = 0; i < n; i++) {
            if (i > 0 && num[i] == num[i - 1]) continue;

            int newTarget = target - num[i];
            map<int, int> mp;
            for (int j = i + 1; j < n; j++) {
                int need = newTarget - num[j];
                if (mp.count(need)) {
                    vector<int> triplet = {num[i], need, num[j]};
                    sort(triplet.begin(), triplet.end());
                    res.push_back(triplet);
                    while (j + 1 < n && num[j] == num[j + 1]) j++;
                }
                mp[num[j]] = j;
            }
        }

        sort(res.begin(), res.end());
        res.erase(unique(res.begin(), res.end()), res.end());
        return res;
    }

    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        int n = nums.size();

        for (int i = 0; i < n; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            vector<int> cur(nums.begin() + i + 1, nums.end());
            vector<vector<int>> triples = threeSumTarget(cur, target - nums[i]);
            for (auto& t : triples) {
                t.push_back(nums[i]);
                sort(t.begin(), t.end());
                res.push_back(t);
            }
        }

        sort(res.begin(), res.end());
        res.erase(unique(res.begin(), res.end()), res.end());
        return res;
    }
};




// 这个报错说明代码中出现了 **整数溢出（integer overflow）**，主要出现在执行

// ```
// int newTarget = target - num[i];
// ```

// 这一行时。

// 在 C++ 中，`int` 的取值范围大约是 `[-2,147,483,648, 2,147,483,647]`。当 `target` 与 `num[i]` 都接近极值时（例如 `target = -2e9, num[i] = 1e9`），二者相减的结果会超出范围，触发 Undefined Behavior。

// ---

// ### ✅ 解决方法一：使用 long long

// 最直接有效的办法是将所有可能参与大数运算的变量改为 `long long`，防止溢出。

// 修改如下：

// ```cpp
// #include <vector>
// #include <map>
// #include <algorithm>
// using namespace std;

// class Solution {
// public:
//     vector<vector<int>> threeSumTarget(vector<int>& num, long long target) {
//         vector<vector<int>> res;
//         sort(num.begin(), num.end());
//         int n = num.size();

//         for (int i = 0; i < n; i++) {
//             if (i > 0 && num[i] == num[i - 1]) continue;

//             long long newTarget = target - num[i];
//             map<long long, int> mp;
//             for (int j = i + 1; j < n; j++) {
//                 long long need = newTarget - num[j];
//                 if (mp.count(need)) {
//                     vector<int> triplet = {num[i], (int)need, num[j]};
//                     sort(triplet.begin(), triplet.end());
//                     res.push_back(triplet);
//                     while (j + 1 < n && num[j] == num[j + 1]) j++;
//                 }
//                 mp[num[j]] = j;
//             }
//         }

//         sort(res.begin(), res.end());
//         res.erase(unique(res.begin(), res.end()), res.end());
//         return res;
//     }

//     vector<vector<int>> fourSum(vector<int>& nums, int target) {
//         vector<vector<int>> res;
//         sort(nums.begin(), nums.end());
//         int n = nums.size();

//         for (int i = 0; i < n; i++) {
//             if (i > 0 && nums[i] == nums[i - 1]) continue;
//             vector<int> cur(nums.begin() + i + 1, nums.end());
//             vector<vector<int>> triples = threeSumTarget(cur, (long long)target - nums[i]);
//             for (auto& t : triples) {
//                 t.push_back(nums[i]);
//                 sort(t.begin(), t.end());
//                 res.push_back(t);
//             }
//         }

//         sort(res.begin(), res.end());
//         res.erase(unique(res.begin(), res.end()), res.end());
//         return res;
//     }
// };
// ```

// ---

// ### ✅ 解决方法二：使用 `long long` 仅在计算时转换

// 若不想大范围修改类型，也可以只在运算时进行显式类型转换：

// ```cpp
// long long newTarget = (long long)target - num[i];
// long long need = newTarget - num[j];
// ```

// 这种做法更简洁，也能完全避免溢出。

// ---

// ### 💡总结

// 整数溢出是 C++ 中最常见的隐性错误之一，在涉及大数相加或相减（尤其是题目输入范围在 ±1e9 级别）时，
// **应当始终将中间计算结果转为 `long long`**，确保数值安全。
